#ifndef XLCOMM_BASE_SYNCLOG_H_
#define XLCOMM_BASE_SYNCLOG_H_

#include <stdint.h>

#include <mutex>
#include <string>

#include "xlcomm/base/date_time.h"
#include "xlcomm/base/file.h"
#include "xlcomm/define.h"
#include "xlcomm/noncopyable.h"

namespace xlcomm {

// 同步日志类
class XLCOMM_API SyncLog : noncopyable {
 public:
  explicit SyncLog(const char* basename, int64_t roll_size = 1024 * 1024 * 1024,
                   bool thread_safe = true);

  // 追加日志内容
  void Append(const char* msg, size_t len);

  // 清空缓冲区，写到磁盘
  void Flush();

 private:
  // 追加日志内容（未加锁版本）
  void AppendUnlock(const char* msg, size_t len);
  // 滚动日志文件——即创建新文件写日志
  void RollFile();
  // 生成日志文件名。格式: basename.datetime.hostname.processid.log
  static std::string GetLogFileName(const std::string& basename);

  const std::string basename_;
  const int64_t roll_size_;
  bool thread_safe_;
  std::mutex mutex_;
  File file_;
  int64_t written_bytes_;
  CommTime cur_date_;
  std::string cur_filename_;
};

}  // namespace xlcomm

#endif  // XLCOMM_BASE_SYNCLOG_H_